package sofia.Persistencia.Managers;


import Principal.MainSofia;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;
import sofia.LogicaNegocio.Terapia;
import sofia.Persistencia.Entidades.EFisioterapeuta;
import sofia.Persistencia.Entidades.EPaciente;
import sofia.Persistencia.Entidades.ESecretaria;
import sofia.Persistencia.Entidades.ETerapia;
/**
 * Manager que comunica la capa de persistencia (Entidad Terapia) con la capa bean (CitaBean)
 * @author crisalt
 * @author JAPeTo
 * @see sofia.Persistencia.Entidades.ETerapia
 * @see sofia.bean.CitaBean
 */
public class MTerapia {

        @PersistenceUnit
        private EntityManagerFactory managerFactory;
        private EntityManager entityManager;
        /**
         * Contructor de la clase MTerapia (Manager de la Entidad Terapia)
         */
        public MTerapia() {
//                managerFactory = Persistence.createEntityManagerFactory( "SofiaPU" );//Esto no hay necesidad de hacerlo haremos una clase Singleton q haga esto
//                entityManager = managerFactory.createEntityManager();
                managerFactory = MainSofia.managerFactory;
                entityManager = managerFactory.createEntityManager();
        }

        /**
        * Este metodo se encarga de la persistencia en la entidad Informe
        * de un objeto Informe.
        *
         * @param objTerapia
         * @param id_fisio
         * @param idPaciente
         * @throws RollbackException
         * @throws EntityExistsException 
        */
        public void crearTerapia( final Terapia objTerapia , final String id_fisio , final String idPaciente , final String idSEcretaria ) throws RollbackException, EntityExistsException {
                entityManager.clear();
                ETerapia entidadTerapia = new ETerapia();
                entidadTerapia.setComentarioVideo( objTerapia.getComentarioVideo() );
                entidadTerapia.setFechaTerapia( objTerapia.getFechaTerapia() );
                entidadTerapia.setHoraTerapia( objTerapia.getHoraTerapia() );
                entidadTerapia.setProgresoYLogros( objTerapia.getProgresoYLogros() );
                entidadTerapia.setUrlVideo( objTerapia.getUrlVideo() );
                EFisioterapeuta entidadFisioterapeuta = entityManager.find( EFisioterapeuta.class , id_fisio );
                entidadTerapia.setFisioId( entidadFisioterapeuta.getIdLogin() );
                EPaciente entidadPaciente = entityManager.find( EPaciente.class , idPaciente );
                entidadTerapia.setPacienteId( entidadPaciente.getIdCedula() );
                ESecretaria entidadSecretaria = entityManager.find( ESecretaria.class , idSEcretaria );
                entidadTerapia.setESecretaria( entidadSecretaria );
                //persiste el objeto en la entidad
                EntityTransaction transaccion = entityManager.getTransaction();
                try {
                        transaccion.begin();
                        entityManager.persist( entidadTerapia );
                }
                catch (EntityExistsException ex) {
                        throw ex;
                }
                finally {
                        transaccion.commit();
                }
                entityManager.clear();
        }

        public void actualizarTerapia( final String idTerapia , final Terapia terapia ) {
                entityManager.clear();
                ETerapia entidadTerapia;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadTerapia = entityManager.find( ETerapia.class , idTerapia );
                transaccion.commit();
                if( entidadTerapia != null ) {
//                        la llave es unica no puede ser cambiada
//                        entidadPaciente.setIdCedula( paciente.getIdCedula() );
                        entidadTerapia.setComentarioVideo( terapia.getComentarioVideo() );
                        entidadTerapia.setFechaTerapia( terapia.getFechaTerapia() );
//                        entidadTerapia.setFisioId( terapia.getIdFisio() );
//                        entidadTerapia.setHoraTerapia( terapia.getHoraTerapia() );
//                        entidadTerapia.setPacienteId( terapia.getIdPaciente() );
                        entidadTerapia.setProgresoYLogros( terapia.getProgresoYLogros() );
                        entidadTerapia.setUrlVideo( terapia.getUrlVideo() );

                        transaccion.begin();
                        entityManager.merge( entidadTerapia );
                        transaccion.commit();
                }
                entityManager.clear();
        }

        public void eliminarTerapia( final int idTerapia ) {
                entityManager.clear();
                ETerapia entidadTerapia;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadTerapia = entityManager.find( ETerapia.class , idTerapia );
                entityManager.remove( entidadTerapia );
                transaccion.commit();
                entityManager.clear();
        }

        public Terapia obtenerTerapia( final String idTerapia ) {
                entityManager.clear();
                ETerapia entidadTerapia;
                Terapia terapia = null;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadTerapia = entityManager.find( ETerapia.class , idTerapia );
                transaccion.commit();
//                if( entidadTerapia != null ) {
//                        terapia = new Terapia();
//                        terapia.setIdTerapia( entidadTerapia.getIdTerapia() );
//                        terapia.setComentarioVideo( entidadTerapia.getComentarioVideo() );
//                        terapia.setFechaTerapia( entidadTerapia.getFechaTerapia() );
//                        terapia.setHoraTerapia( entidadTerapia.getHoraTerapia() );
//                        terapia.setProgresoYLogros( entidadTerapia.getProgresoYLogros() );
//                        terapia.setUrlVideo( entidadTerapia.getUrlVideo() );
//                        terapia.setIdFisio( entidadTerapia.getFisioId() );
//                        terapia.setIdPaciente( entidadTerapia.getPacienteId() );
//                }
                entityManager.clear();
                return terapia;
        }
        /**
         *
         * @return lista de terapias para hoy
         */
        public List obtenerTerapiasPorHoy() {
                entityManager.clear();
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                List terapias = null;
                Query query = entityManager.createNamedQuery("ETerapia.findByFechaTerapia");
                query.setParameter("fechaTerapia",new Date());
                terapias = query.getResultList();
                transaccion.commit();
                if( !terapias.isEmpty() ) {
                        System.out.println( "Leyendo " + terapias.size() + " comentarios" );
//                        Iterator stIterator = terapias.iterator();
//                        while( stIterator.hasNext() ){
//                                ETerapia entidadTerapia = (ETerapia)stIterator.next();
//                                System.out.println( "id " + entidadTerapia.getIdTerapia() );
//                        }
                }
                entityManager.clear();
                return terapias;
        }
        public List obtenerTerapiasRegistradas() {
                entityManager.clear();
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                List terapias = null;
                Query query = entityManager.createQuery( "SELECT eTerapia FROM ETerapia eTerapia" );
                terapias = query.getResultList();
                transaccion.commit();
                if( !terapias.isEmpty() ) {
                        System.out.println( "Leyendo " + terapias.size() + " comentarios" );
//                        Iterator stIterator = terapias.iterator();
//                        while( stIterator.hasNext() ){
//                                ETerapia entidadTerapia = (ETerapia)stIterator.next();
//                                System.out.println( "id " + entidadTerapia.getIdTerapia() );
//                        }
                }
                entityManager.clear();
                return terapias;
        }

}

